import React from "react";
import { Dimension } from "../common/types";

/**
 * @typedef { IModalProps } - Пропсы для компонента модального окна.
 * @property { Dimension } dimension - Размер модального окна.
 * @property { HTMLElement } container - Элемент, в который будет встраиваться модальное окно. По умолчанию document.body. Используется портал.
 * @property { boolean } closeOnOutsideClick - Флаг, указывающий, закрывать ли модальное окно при клике вне элемента.
 * @property { boolean } displayCloseIcon - Флаг, указывающий, показывать ли кнопку закрытия модального окна.
 * @property { () => void } onClose - Callback на закрытие модального окна.
 * @property { boolean } showModal - Указывает отображать модальное окно или скрыть. 
 */
export interface IModalProps extends React.HTMLAttributes<HTMLDivElement> {
    dimension?: Dimension;
    container?: HTMLElement;
    closeOnOutsideClick?: boolean;
    displayCloseIcon?: boolean;
    onClose?:  () => void;
    showModal?: boolean;
}

/**
 * @typedef TStyledModalProps - Тип для пропсов styled компонента модального окна.
 */
export type TStyledModalProps = Pick<IModalProps, 'dimension'>;

/**
 * @typedef { ICompoundComponents } - Тип для составных компонентов модального окна.
 */
export interface ICompoundComponents {
    Title?: React.FC<React.HTMLAttributes<HTMLDivElement>>;
    Content?: React.FC<React.HTMLAttributes<HTMLDivElement>>;
    Actions?: React.FC<React.HTMLAttributes<HTMLDivElement>>;
}

/**
 * @typedef { TContext } - Тип используется для создания контекста модального окна.
 * @param { inhereModal } - Определяет находятся ли составные компоненты внутри Modal или нет.
 * @param { closeModal } - Определяет стандартную функцию для закрытия модального окна.
 * @param { Element } container - Элемент, в который будет встраиваться модальное окно. По умолчанию document.body. Используется портал.
 * @param { boolean } closeOnOutsideClick - Флаг, указывающий, закрывать ли модальное окно при клике вне элемента.
 * @param { boolean } displayCloseIcon - Флаг, указывающий, показывать ли кнопку закрытия модального окна.
 * @param { () => void } onClose - Callback на закрытие модального окна.
 */
export type TContext =
    Omit<IModalProps, 'dimension' | 'container' | 'showModal'> & { inhereModal?: boolean; };
